package ar.edu.itba.it.poo

object Complex {
	// TODO: El tipo del argumento debería ser Number en lugar de Int para que no genere un error de compilación el siguiente programa:
	// val n1 = new Complex(1, 2)
	// val n2 = n1 + 2.0
    implicit def numberToComplex(number: Int): Complex = new Complex(number.doubleValue, 0)
}

class Complex(val real: Double, val imaginary: Double) {

    def this(r: Double) = this(r, 0)

    def +(that: Complex) = new Complex(real + that.real, imaginary + that.imaginary)
    def -(that: Complex) = new Complex(real - that.real, imaginary - that.imaginary)
    def *(that: Complex) = new Complex(real * that.real - imaginary * that.imaginary,
        real * that.imaginary + imaginary * that.real)

    override def toString = real + " + " + imaginary + "i"
}

object ComplexTest extends Application {

    // TODO: No esta bueno tener que hacer explícitamente este import. Según la documentación no debería ser necesario ya que
	// se buscan conversiones implicitas en el companion object del tipo esperado o del tipo del resultado.
    import ar.edu.itba.it.poo.Complex._

    val n1 = new Complex(-1, 2)
    val n2 = new Complex(5)

    println("n1: " + n1)
    println("n1 + n2: " + (n1 + n2))
    println("n1 * n2: " + (n1 * n2))
    
    val n3 = n1 + 5
    println("n1 + 5: " + n3)
}